source('../settings/settings.R')
source('commonFunctions.R')
persons <- SELECTED_SUBJECTS
drive <- 1
inputFile <- str_interp('../data/processed/distancewise/TT1_Drive_${drive}_${distPrev}m_${distNext}m.csv', list(drive=drive, distPrev=DISTANCE_PREV, distNext=DISTANCE_NEXT))
outputFile <- str_interp("../data/processed/analysis/TT1_Drive_${drive}_PP_${distPrev}m_${distNext}m.csv", list(drive=drive, distPrev=DISTANCE_PREV, distNext=DISTANCE_NEXT))
all_Drive1 <- read.csv(inputFile)
all_Drive1$Subject <- as.factor(all_Drive1$Subject)
all_Drive1$logPerspiration <- log(all_Drive1$Perspiration)
mean_pp <- vector(mode="list", length=length(persons))
names(mean_pp) <- persons
std_pp <- vector(mode="list", length=length(persons))
names(std_pp) <- persons
# Segments
mean_pp_seg0 <- vector(mode="list", length=length(persons))
names(mean_pp_seg0) <- persons
mean_pp_seg1 <- vector(mode="list", length=length(persons))
names(mean_pp_seg1) <- persons
mean_pp_seg2 <- vector(mode="list", length=length(persons))
names(mean_pp_seg2) <- persons
mean_pp_seg3 <- vector(mode="list", length=length(persons))
names(mean_pp_seg3) <- persons
mean_pp_seg4 <- vector(mode="list", length=length(persons))
names(mean_pp_seg4) <- persons
for(p in persons) {
pData <- all_Drive1[(all_Drive1$Subject==as.integer(p) | all_Drive1$Subject==p),]
pData_act1 <- pData[pData$Activity == 1,]
if(p == "41") {
# This subjest has suspecious PP in the last phase (Phase = 4)
pData_seg0 <- pData[pData$Phase==0 & pData$Time <= 370,]
} else {
pData_seg0 <- pData[pData$Phase==0,]
}
pData_seg1 <- pData[pData$Phase==1 & pData$Activity==1 & pData$Time < 110,]
pData_seg2 <- pData[pData$Phase==2 & pData$Activity==1 & pData$Time < 250,]
pData_seg3 <- pData[pData$Phase==3 & pData$Activity==1 & pData$Time < 350,]
pData_seg4 <- pData[pData$Phase==4 & pData$Activity==1,]
if(p == "41") {
# This subjest has suspecious PP in the last phase (Phase = 4)
mean_pp[[p]] <- mean(pData_act1[pData_act1$Time <= 370,]$ppLogNormalized)
} else {
mean_pp[[p]] <- mean(pData_act1$ppLogNormalized)
}
std_pp[[p]] <- sd(pData$ppLogNormalized)
mean_pp_seg0[[p]] <- mean(pData_seg0$ppLogNormalized)
mean_pp_seg1[[p]] <- mean(pData_seg1$ppLogNormalized)
mean_pp_seg2[[p]] <- mean(pData_seg2$ppLogNormalized)
mean_pp_seg3[[p]] <- mean(pData_seg3$ppLogNormalized)
if (p == "41") {
mean_pp_seg4[[p]] <- mean_pp[[p]]
} else {
mean_pp_seg4[[p]] <- mean(pData_seg4$ppLogNormalized)
}
}
plt_AllAcc <- vector(mode="list", length=length(persons))
names(plt_AllAcc) <- persons
COLOR_ACC = "#02A3C8"
COLOR_PP = "#F28E8E"
COLOR_BRAKE = "#888888"
y1 <- list(
tickfont = list(color = COLOR_ACC),
title="Degree",
range=c(0, max(all_Drive1$Acceleration))
)
y2 <- list(
tickfont = list(color = COLOR_PP),
overlaying = "y",
side = "right",
title = "Log Perspiration",
showgrid = FALSE,
range=c(-max(all_Drive1$ppLogNormalized), max(all_Drive1$ppLogNormalized))
)
for (p in persons) {
pData <- all_Drive1[all_Drive1$Subject==as.integer(p) | all_Drive1$Subject==p,]
pData_seg0 <- pData[pData$Phase==0,]
pData_seg1 <- pData[pData$Phase==1 & pData$Activity==1 & pData$Time < 110,]
pData_seg2 <- pData[pData$Phase==2 & pData$Activity==1 & pData$Time < 250,]
pData_seg3 <- pData[pData$Phase==3 & pData$Activity==1 & pData$Time < 350,]
pData_seg4 <- pData[pData$Phase==4 & pData$Activity==1,]
plot_Acc <- plot_ly(pData, x = ~Time, height=400, width=900) %>%
# add_trace(name="Acceleration", y = ~Acceleration, type = 'scatter', mode = 'lines', line=list(width=1.5, color=COLOR_ACC)) %>%
add_trace(name="PP", y = ~ppLogNormalized, type = 'scatter', mode = 'lines', connectgaps=F, line=list(width=1.5, color=COLOR_PP), yaxis = "y2") %>%
add_segments(x = min(pData$Time), xend = max(pData$Time), y = mean_pp[[p]], yend = mean_pp[[p]],
yaxis = "y2", name="Avg. PP (straight)",
line=list(color="darkgray", dash = 'dot')) %>%
add_segments(x = min(pData$Time), xend = max(pData$Time), y = mean_pp_seg0[[p]], yend = mean_pp_seg0[[p]],
yaxis = "y2", name="Avg. PP (turning)",
line=list(color="black", dash = 'dot')) %>%
add_segments(x = min(pData_seg1$Time), xend = max(pData_seg1$Time), y = mean_pp_seg1[[p]], yend = mean_pp_seg1[[p]],
yaxis = "y2", name="Avg. PP (1st part)",
line=list(color="red", dash = 'dot')) %>%
add_segments(x = min(pData_seg2$Time), xend = max(pData_seg2$Time), y = mean_pp_seg2[[p]], yend = mean_pp_seg2[[p]],
yaxis = "y2", name="Avg. PP (2nd part)",
line=list(color="green", dash = 'dot')) %>%
add_segments(x = min(pData_seg3$Time), xend = max(pData_seg3$Time), y = mean_pp_seg3[[p]], yend = mean_pp_seg3[[p]],
yaxis = "y2", name="Avg. PP (3rd part)",
line=list(color="blue", dash = 'dot')) %>%
add_segments(x = min(pData_seg4$Time), xend = max(pData_seg4$Time), y = mean_pp_seg4[[p]], yend = mean_pp_seg4[[p]],
yaxis = "y2", name="Avg. PP (4th part)",
line=list(color="purple", dash = 'dot')) %>%
layout(
title=paste0("Subject #", p),
xaxis=list(title="Time [s]", range=c(0)),
yaxis=y1,
yaxis2=y2,
margin = list(l = 50, r = 50, b = 50, t = 50, pad = 4),
legend = list(x = 0.5, xanchor = "center", y = -0.4, bgcolor = "rgba(0,0,0,0)", title="Metric", orientation = "h"),
autosize = F
)
plt_AllAcc[[p]] <- plot_Acc
}
no non-missing arguments to min; returning Infno non-missing arguments to max; returning -Inf
htmltools::tagList(plt_AllAcc)
NUMBER_OF_CLUSTERS = 3
color_darkpink = "#e75480"
CLUSTER_BRANCH_COLORS <- c("blue", "darkred", color_darkpink, "black")[1:NUMBER_OF_CLUSTERS]
CLUSTER_LABEL_COLORS <- c("blue", "darkred", color_darkpink, "black")[1:NUMBER_OF_CLUSTERS]
dfPP <- as.data.frame(cbind(
unlist(mean_pp),
unlist(std_pp),
unlist(mean_pp_seg0),
unlist(mean_pp_seg1),
unlist(mean_pp_seg2),
unlist(mean_pp_seg3),
unlist(mean_pp_seg4)))
names(dfPP) <- c("MeanPP", "StdPP", "MeanPP_Seg0", "MeanPP_Seg1", "MeanPP_Seg2", "MeanPP_Seg3", "MeanPP_Seg4")
behavioralMatrixClustering <- as.matrix(dfPP)
distMatrix <- dist(behavioralMatrixClustering)
hresults <- distMatrix %>% hclust
hc <- hresults %>%
as.dendrogram %>%
set("nodes_cex", NUMBER_OF_CLUSTERS) %>%
set("labels_col", value = CLUSTER_LABEL_COLORS, k=NUMBER_OF_CLUSTERS) %>%
# set("leaves_pch", 19) %>%
# set("leaves_col", value = c("gray"), k=NUMBER_OF_CLUSTERS) %>%
set("branches_k_color", value=CLUSTER_BRANCH_COLORS, k=NUMBER_OF_CLUSTERS)
plot(hc)
legend("topright",
title="Drive=Cognitive \nHierachical Clustering",
legend = c("Group 1", "Group 2", "Group 3"),
col = c("darkred", "pink" , "blue"),
pch = c(20,20,20), bty = "n", pt.cex = 1.5, cex = 0.8 ,
text.col = "black", horiz = FALSE, inset = c(0.4, 0.1))

# Store analysis data
dfx <- dfPP
dfx <- cbind(persons, dfx)
names(dfx) <- c("Subject", names(dfPP))
write.csv(dfx, outputFile, row.names = F)
Linear Model
sampledData <- getSampleSegmentedData(NA, all_Drive1, window=WINDOW_TIME)
linearModelOnline <- lmer(ppNext ~
(1 | Subject)
+ Speed_u
+ Speed_std
+ Acc_u
+ Acc_std
+ Brake_u
+ Brake_std
+ Steering_u
+ Steering_std,
data=sampledData, REML = T)
# lmer(ppLogNormalized ~ (1 | Subject) + Speed_u + Speed_std + Acc_u + Acc_std + Brake_u + Brake_std + Steering_u + Steering_std + HR + BR, data = pData, REML = T)
# anova(model)
summary(linearModelOnline)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: ppNext ~ (1 | Subject) + Speed_u + Speed_std + Acc_u + Acc_std + Brake_u + Brake_std + Steering_u + Steering_std
Data: sampledData
REML criterion at convergence: -9935.5
Scaled residuals:
Min 1Q Median 3Q Max
-6.7105 -0.5402 -0.0175 0.5512 3.7751
Random effects:
Groups Name Variance Std.Dev.
Subject (Intercept) 0.0002925 0.01710
Residual 0.0026650 0.05162
Number of obs: 3275, groups: Subject, 21
Fixed effects:
Estimate Std. Error df t value Pr(>|t|)
(Intercept) 1.224e-01 1.234e-02 1.281e+03 9.920 < 2e-16 ***
Speed_u -5.814e-03 3.798e-04 3.197e+03 -15.308 < 2e-16 ***
Speed_std -3.434e-03 1.520e-03 3.265e+03 -2.259 0.02393 *
Acc_u 2.557e-03 4.012e-04 2.694e+03 6.372 2.18e-10 ***
Acc_std 5.077e-03 3.503e-04 3.265e+03 14.491 < 2e-16 ***
Brake_u 4.210e-03 7.247e-04 3.255e+03 5.810 6.87e-09 ***
Brake_std -3.922e-03 7.216e-04 3.265e+03 -5.434 5.91e-08 ***
Steering_u 4.846e-05 1.176e-05 3.265e+03 4.119 3.89e-05 ***
Steering_std 1.061e-04 3.268e-05 3.264e+03 3.246 0.00118 **
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Correlation of Fixed Effects:
(Intr) Speed_ Spd_st Acc_u Acc_st Brake_ Brk_st Sterng_
Speed_u -0.819
Speed_std -0.157 0.056
Acc_u -0.268 -0.223 0.040
Acc_std -0.257 0.160 -0.133 0.044
Brake_u -0.168 0.107 -0.068 0.148 0.102
Brake_std -0.046 0.207 -0.094 -0.232 -0.300 -0.835
Steering_u -0.314 0.305 0.069 0.052 0.040 0.342 -0.197
Steerng_std -0.609 0.551 -0.235 0.201 0.434 0.156 -0.164 0.070
plot(linearModelOnline)

behavioralColumns <- BEHAVIORAL_COLUMNS
behavioralMatrix <- matrix(nrow = length(persons), ncol = length(behavioralColumns))
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKYGBge3J9CnNvdXJjZSgnLi4vc2V0dGluZ3Mvc2V0dGluZ3MuUicpCnNvdXJjZSgnY29tbW9uRnVuY3Rpb25zLlInKQpgYGAKCmBgYHtyfQpwZXJzb25zIDwtIFNFTEVDVEVEX1NVQkpFQ1RTCmRyaXZlIDwtIDEKaW5wdXRGaWxlIDwtIHN0cl9pbnRlcnAoJy4uL2RhdGEvcHJvY2Vzc2VkL2Rpc3RhbmNld2lzZS9UVDFfRHJpdmVfJHtkcml2ZX1fJHtkaXN0UHJldn1tXyR7ZGlzdE5leHR9bS5jc3YnLCBsaXN0KGRyaXZlPWRyaXZlLCBkaXN0UHJldj1ESVNUQU5DRV9QUkVWLCBkaXN0TmV4dD1ESVNUQU5DRV9ORVhUKSkKb3V0cHV0RmlsZSA8LSBzdHJfaW50ZXJwKCIuLi9kYXRhL3Byb2Nlc3NlZC9hbmFseXNpcy9UVDFfRHJpdmVfJHtkcml2ZX1fUFBfJHtkaXN0UHJldn1tXyR7ZGlzdE5leHR9bS5jc3YiLCBsaXN0KGRyaXZlPWRyaXZlLCBkaXN0UHJldj1ESVNUQU5DRV9QUkVWLCBkaXN0TmV4dD1ESVNUQU5DRV9ORVhUKSkKCmFsbF9Ecml2ZTEgPC0gcmVhZC5jc3YoaW5wdXRGaWxlKQphbGxfRHJpdmUxJFN1YmplY3QgPC0gYXMuZmFjdG9yKGFsbF9Ecml2ZTEkU3ViamVjdCkKYWxsX0RyaXZlMSRsb2dQZXJzcGlyYXRpb24gPC0gbG9nKGFsbF9Ecml2ZTEkUGVyc3BpcmF0aW9uKQpgYGAKCgpgYGB7cn0KbWVhbl9wcCA8LSB2ZWN0b3IobW9kZT0ibGlzdCIsIGxlbmd0aD1sZW5ndGgocGVyc29ucykpIApuYW1lcyhtZWFuX3BwKSA8LSBwZXJzb25zCgpzdGRfcHAgPC0gdmVjdG9yKG1vZGU9Imxpc3QiLCBsZW5ndGg9bGVuZ3RoKHBlcnNvbnMpKSAKbmFtZXMoc3RkX3BwKSA8LSBwZXJzb25zCgojIFNlZ21lbnRzCm1lYW5fcHBfc2VnMCA8LSB2ZWN0b3IobW9kZT0ibGlzdCIsIGxlbmd0aD1sZW5ndGgocGVyc29ucykpIApuYW1lcyhtZWFuX3BwX3NlZzApIDwtIHBlcnNvbnMKbWVhbl9wcF9zZWcxIDwtIHZlY3Rvcihtb2RlPSJsaXN0IiwgbGVuZ3RoPWxlbmd0aChwZXJzb25zKSkgCm5hbWVzKG1lYW5fcHBfc2VnMSkgPC0gcGVyc29ucwptZWFuX3BwX3NlZzIgPC0gdmVjdG9yKG1vZGU9Imxpc3QiLCBsZW5ndGg9bGVuZ3RoKHBlcnNvbnMpKSAKbmFtZXMobWVhbl9wcF9zZWcyKSA8LSBwZXJzb25zCm1lYW5fcHBfc2VnMyA8LSB2ZWN0b3IobW9kZT0ibGlzdCIsIGxlbmd0aD1sZW5ndGgocGVyc29ucykpIApuYW1lcyhtZWFuX3BwX3NlZzMpIDwtIHBlcnNvbnMKbWVhbl9wcF9zZWc0IDwtIHZlY3Rvcihtb2RlPSJsaXN0IiwgbGVuZ3RoPWxlbmd0aChwZXJzb25zKSkgCm5hbWVzKG1lYW5fcHBfc2VnNCkgPC0gcGVyc29ucwoKCmZvcihwIGluIHBlcnNvbnMpIHsKICBwRGF0YSA8LSBhbGxfRHJpdmUxWyhhbGxfRHJpdmUxJFN1YmplY3Q9PWFzLmludGVnZXIocCkgfCBhbGxfRHJpdmUxJFN1YmplY3Q9PXApLF0KICBwRGF0YV9hY3QxIDwtIHBEYXRhW3BEYXRhJEFjdGl2aXR5ID09IDEsXQogIAogIGlmKHAgPT0gIjQxIikgewogICAgIyBUaGlzIHN1Ymplc3QgaGFzIHN1c3BlY2lvdXMgUFAgaW4gdGhlIGxhc3QgcGhhc2UgKFBoYXNlID0gNCkKICAgIHBEYXRhX3NlZzAgPC0gcERhdGFbcERhdGEkUGhhc2U9PTAgJiBwRGF0YSRUaW1lIDw9IDM3MCxdCiAgfSBlbHNlIHsKICAgIHBEYXRhX3NlZzAgPC0gcERhdGFbcERhdGEkUGhhc2U9PTAsXQogIH0KICAKICBwRGF0YV9zZWcxIDwtIHBEYXRhW3BEYXRhJFBoYXNlPT0xICYgcERhdGEkQWN0aXZpdHk9PTEgJiBwRGF0YSRUaW1lIDwgMTEwLF0KICBwRGF0YV9zZWcyIDwtIHBEYXRhW3BEYXRhJFBoYXNlPT0yICYgcERhdGEkQWN0aXZpdHk9PTEgJiBwRGF0YSRUaW1lIDwgMjUwLF0KICBwRGF0YV9zZWczIDwtIHBEYXRhW3BEYXRhJFBoYXNlPT0zICYgcERhdGEkQWN0aXZpdHk9PTEgJiBwRGF0YSRUaW1lIDwgMzUwLF0KICBwRGF0YV9zZWc0IDwtIHBEYXRhW3BEYXRhJFBoYXNlPT00ICYgcERhdGEkQWN0aXZpdHk9PTEsXQogIAogIGlmKHAgPT0gIjQxIikgewogICAgIyBUaGlzIHN1Ymplc3QgaGFzIHN1c3BlY2lvdXMgUFAgaW4gdGhlIGxhc3QgcGhhc2UgKFBoYXNlID0gNCkKICAgIG1lYW5fcHBbW3BdXSA8LSBtZWFuKHBEYXRhX2FjdDFbcERhdGFfYWN0MSRUaW1lIDw9IDM3MCxdJHBwTG9nTm9ybWFsaXplZCkKICB9IGVsc2UgewogICAgbWVhbl9wcFtbcF1dIDwtIG1lYW4ocERhdGFfYWN0MSRwcExvZ05vcm1hbGl6ZWQpCiAgfQogIAogIHN0ZF9wcFtbcF1dIDwtIHNkKHBEYXRhJHBwTG9nTm9ybWFsaXplZCkKICBtZWFuX3BwX3NlZzBbW3BdXSA8LSBtZWFuKHBEYXRhX3NlZzAkcHBMb2dOb3JtYWxpemVkKQogIG1lYW5fcHBfc2VnMVtbcF1dIDwtIG1lYW4ocERhdGFfc2VnMSRwcExvZ05vcm1hbGl6ZWQpCiAgbWVhbl9wcF9zZWcyW1twXV0gPC0gbWVhbihwRGF0YV9zZWcyJHBwTG9nTm9ybWFsaXplZCkKICBtZWFuX3BwX3NlZzNbW3BdXSA8LSBtZWFuKHBEYXRhX3NlZzMkcHBMb2dOb3JtYWxpemVkKQogIAogIGlmIChwID09ICI0MSIpIHsKICAgIG1lYW5fcHBfc2VnNFtbcF1dIDwtIG1lYW5fcHBbW3BdXQogIH0gZWxzZSB7CiAgICBtZWFuX3BwX3NlZzRbW3BdXSA8LSBtZWFuKHBEYXRhX3NlZzQkcHBMb2dOb3JtYWxpemVkKQogIH0KfQoKYGBgCgpgYGB7cn0KcGx0X0FsbEFjYyA8LSB2ZWN0b3IobW9kZT0ibGlzdCIsIGxlbmd0aD1sZW5ndGgocGVyc29ucykpIApuYW1lcyhwbHRfQWxsQWNjKSA8LSBwZXJzb25zCgpDT0xPUl9BQ0MgPSAiIzAyQTNDOCIKQ09MT1JfUFAgPSAiI0YyOEU4RSIKQ09MT1JfQlJBS0UgPSAiIzg4ODg4OCIKCnkxIDwtIGxpc3QoCiAgdGlja2ZvbnQgPSBsaXN0KGNvbG9yID0gQ09MT1JfQUNDKSwKICB0aXRsZT0iRGVncmVlIiwKICByYW5nZT1jKDAsIG1heChhbGxfRHJpdmUxJEFjY2VsZXJhdGlvbikpCikKeTIgPC0gbGlzdCgKICB0aWNrZm9udCA9IGxpc3QoY29sb3IgPSBDT0xPUl9QUCksCiAgb3ZlcmxheWluZyA9ICJ5IiwKICBzaWRlID0gInJpZ2h0IiwKICB0aXRsZSA9ICJMb2cgUGVyc3BpcmF0aW9uIiwKICBzaG93Z3JpZCA9IEZBTFNFLAogIHJhbmdlPWMoLW1heChhbGxfRHJpdmUxJHBwTG9nTm9ybWFsaXplZCksIG1heChhbGxfRHJpdmUxJHBwTG9nTm9ybWFsaXplZCkpCikKCmZvciAocCBpbiBwZXJzb25zKSB7CiAgcERhdGEgPC0gYWxsX0RyaXZlMVthbGxfRHJpdmUxJFN1YmplY3Q9PWFzLmludGVnZXIocCkgfCBhbGxfRHJpdmUxJFN1YmplY3Q9PXAsXQogIAogIHBEYXRhX3NlZzAgPC0gcERhdGFbcERhdGEkUGhhc2U9PTAsXQogIHBEYXRhX3NlZzEgPC0gcERhdGFbcERhdGEkUGhhc2U9PTEgJiBwRGF0YSRBY3Rpdml0eT09MSAmIHBEYXRhJFRpbWUgPCAxMTAsXQogIHBEYXRhX3NlZzIgPC0gcERhdGFbcERhdGEkUGhhc2U9PTIgJiBwRGF0YSRBY3Rpdml0eT09MSAmIHBEYXRhJFRpbWUgPCAyNTAsXQogIHBEYXRhX3NlZzMgPC0gcERhdGFbcERhdGEkUGhhc2U9PTMgJiBwRGF0YSRBY3Rpdml0eT09MSAmIHBEYXRhJFRpbWUgPCAzNTAsXQogIHBEYXRhX3NlZzQgPC0gcERhdGFbcERhdGEkUGhhc2U9PTQgJiBwRGF0YSRBY3Rpdml0eT09MSxdCiAgCiAgcGxvdF9BY2MgPC0gcGxvdF9seShwRGF0YSwgeCA9IH5UaW1lLCBoZWlnaHQ9NDAwLCB3aWR0aD05MDApICU+JQogICAgIyBhZGRfdHJhY2UobmFtZT0iQWNjZWxlcmF0aW9uIiwgeSA9IH5BY2NlbGVyYXRpb24sIHR5cGUgPSAnc2NhdHRlcicsIG1vZGUgPSAnbGluZXMnLCBsaW5lPWxpc3Qod2lkdGg9MS41LCBjb2xvcj1DT0xPUl9BQ0MpKSAlPiUgCiAgICBhZGRfdHJhY2UobmFtZT0iUFAiLCB5ID0gfnBwTG9nTm9ybWFsaXplZCwgdHlwZSA9ICdzY2F0dGVyJywgbW9kZSA9ICdsaW5lcycsIGNvbm5lY3RnYXBzPUYsIGxpbmU9bGlzdCh3aWR0aD0xLjUsIGNvbG9yPUNPTE9SX1BQKSwgeWF4aXMgPSAieTIiKSAlPiUKICAgIGFkZF9zZWdtZW50cyh4ID0gbWluKHBEYXRhJFRpbWUpLCB4ZW5kID0gbWF4KHBEYXRhJFRpbWUpLCB5ID0gbWVhbl9wcFtbcF1dLCB5ZW5kID0gbWVhbl9wcFtbcF1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICB5YXhpcyA9ICJ5MiIsIG5hbWU9IkF2Zy4gUFAgKHN0cmFpZ2h0KSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmU9bGlzdChjb2xvcj0iZGFya2dyYXkiLCBkYXNoID0gJ2RvdCcpKSAlPiUKICAgIGFkZF9zZWdtZW50cyh4ID0gbWluKHBEYXRhJFRpbWUpLCB4ZW5kID0gbWF4KHBEYXRhJFRpbWUpLCB5ID0gbWVhbl9wcF9zZWcwW1twXV0sIHllbmQgPSBtZWFuX3BwX3NlZzBbW3BdXSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHlheGlzID0gInkyIiwgbmFtZT0iQXZnLiBQUCAodHVybmluZykiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lPWxpc3QoY29sb3I9ImJsYWNrIiwgZGFzaCA9ICdkb3QnKSkgJT4lCiAgICBhZGRfc2VnbWVudHMoeCA9IG1pbihwRGF0YV9zZWcxJFRpbWUpLCB4ZW5kID0gbWF4KHBEYXRhX3NlZzEkVGltZSksIHkgPSBtZWFuX3BwX3NlZzFbW3BdXSwgeWVuZCA9IG1lYW5fcHBfc2VnMVtbcF1dLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgeWF4aXMgPSAieTIiLCBuYW1lPSJBdmcuIFBQICgxc3QgcGFydCkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lPWxpc3QoY29sb3I9InJlZCIsIGRhc2ggPSAnZG90JykpICU+JQogICAgYWRkX3NlZ21lbnRzKHggPSBtaW4ocERhdGFfc2VnMiRUaW1lKSwgeGVuZCA9IG1heChwRGF0YV9zZWcyJFRpbWUpLCB5ID0gbWVhbl9wcF9zZWcyW1twXV0sIHllbmQgPSBtZWFuX3BwX3NlZzJbW3BdXSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHlheGlzID0gInkyIiwgbmFtZT0iQXZnLiBQUCAoMm5kIHBhcnQpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZT1saXN0KGNvbG9yPSJncmVlbiIsIGRhc2ggPSAnZG90JykpICU+JQogICAgYWRkX3NlZ21lbnRzKHggPSBtaW4ocERhdGFfc2VnMyRUaW1lKSwgeGVuZCA9IG1heChwRGF0YV9zZWczJFRpbWUpLCB5ID0gbWVhbl9wcF9zZWczW1twXV0sIHllbmQgPSBtZWFuX3BwX3NlZzNbW3BdXSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHlheGlzID0gInkyIiwgbmFtZT0iQXZnLiBQUCAoM3JkIHBhcnQpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZT1saXN0KGNvbG9yPSJibHVlIiwgZGFzaCA9ICdkb3QnKSkgJT4lCiAgICBhZGRfc2VnbWVudHMoeCA9IG1pbihwRGF0YV9zZWc0JFRpbWUpLCB4ZW5kID0gbWF4KHBEYXRhX3NlZzQkVGltZSksIHkgPSBtZWFuX3BwX3NlZzRbW3BdXSwgeWVuZCA9IG1lYW5fcHBfc2VnNFtbcF1dLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgeWF4aXMgPSAieTIiLCBuYW1lPSJBdmcuIFBQICg0dGggcGFydCkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lPWxpc3QoY29sb3I9InB1cnBsZSIsIGRhc2ggPSAnZG90JykpICU+JQogICAgbGF5b3V0KAogICAgICB0aXRsZT1wYXN0ZTAoIlN1YmplY3QgIyIsIHApLCAKICAgICAgeGF4aXM9bGlzdCh0aXRsZT0iVGltZSBbc10iLCByYW5nZT1jKDApKSwgCiAgICAgIHlheGlzPXkxLCAKICAgICAgeWF4aXMyPXkyLCAKICAgICAgbWFyZ2luID0gbGlzdChsID0gNTAsIHIgPSA1MCwgYiA9IDUwLCB0ID0gNTAsIHBhZCA9IDQpLAogICAgICBsZWdlbmQgPSBsaXN0KHggPSAwLjUsIHhhbmNob3IgPSAiY2VudGVyIiwgeSA9IC0wLjQsIGJnY29sb3IgPSAicmdiYSgwLDAsMCwwKSIsIHRpdGxlPSJNZXRyaWMiLCBvcmllbnRhdGlvbiA9ICJoIiksCiAgICAgIGF1dG9zaXplID0gRgogICAgKQogIAogIHBsdF9BbGxBY2NbW3BdXSA8LSBwbG90X0FjYwp9CgoKaHRtbHRvb2xzOjp0YWdMaXN0KHBsdF9BbGxBY2MpCmBgYAoKCmBgYHtyfQpOVU1CRVJfT0ZfQ0xVU1RFUlMgPSAzCgpjb2xvcl9kYXJrcGluayA9ICIjZTc1NDgwIgpDTFVTVEVSX0JSQU5DSF9DT0xPUlMgPC0gYygiYmx1ZSIsICJkYXJrcmVkIiwgY29sb3JfZGFya3BpbmssICJibGFjayIpWzE6TlVNQkVSX09GX0NMVVNURVJTXQpDTFVTVEVSX0xBQkVMX0NPTE9SUyA8LSBjKCJibHVlIiwgImRhcmtyZWQiLCBjb2xvcl9kYXJrcGluaywgImJsYWNrIilbMTpOVU1CRVJfT0ZfQ0xVU1RFUlNdCgoKZGZQUCA8LSBhcy5kYXRhLmZyYW1lKGNiaW5kKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5saXN0KG1lYW5fcHApLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVubGlzdChzdGRfcHApLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVubGlzdChtZWFuX3BwX3NlZzApLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVubGlzdChtZWFuX3BwX3NlZzEpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVubGlzdChtZWFuX3BwX3NlZzIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVubGlzdChtZWFuX3BwX3NlZzMpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVubGlzdChtZWFuX3BwX3NlZzQpKSkKCm5hbWVzKGRmUFApIDwtIGMoIk1lYW5QUCIsICJTdGRQUCIsICJNZWFuUFBfU2VnMCIsICJNZWFuUFBfU2VnMSIsICJNZWFuUFBfU2VnMiIsICJNZWFuUFBfU2VnMyIsICJNZWFuUFBfU2VnNCIpCmJlaGF2aW9yYWxNYXRyaXhDbHVzdGVyaW5nIDwtIGFzLm1hdHJpeChkZlBQKQoKZGlzdE1hdHJpeCA8LSBkaXN0KGJlaGF2aW9yYWxNYXRyaXhDbHVzdGVyaW5nKQpocmVzdWx0cyA8LSBkaXN0TWF0cml4ICU+JSBoY2x1c3QKCmhjIDwtIGhyZXN1bHRzICU+JSAKICAgICAgYXMuZGVuZHJvZ3JhbSAlPiUKICAgICAgc2V0KCJub2Rlc19jZXgiLCBOVU1CRVJfT0ZfQ0xVU1RFUlMpICU+JQogICAgICBzZXQoImxhYmVsc19jb2wiLCB2YWx1ZSA9IENMVVNURVJfTEFCRUxfQ09MT1JTLCBrPU5VTUJFUl9PRl9DTFVTVEVSUykgJT4lCiAgICAgICMgc2V0KCJsZWF2ZXNfcGNoIiwgMTkpICU+JQogICAgICAjIHNldCgibGVhdmVzX2NvbCIsIHZhbHVlID0gYygiZ3JheSIpLCBrPU5VTUJFUl9PRl9DTFVTVEVSUykgJT4lICAgIAogICAgICBzZXQoImJyYW5jaGVzX2tfY29sb3IiLCB2YWx1ZT1DTFVTVEVSX0JSQU5DSF9DT0xPUlMsIGs9TlVNQkVSX09GX0NMVVNURVJTKQoKcGxvdChoYykKbGVnZW5kKCJ0b3ByaWdodCIsIAogICAgIHRpdGxlPSJEcml2ZT1Db2duaXRpdmUgXG5IaWVyYWNoaWNhbCBDbHVzdGVyaW5nIiwKICAgICBsZWdlbmQgPSBjKCJHcm91cCAxIiwgIkdyb3VwIDIiLCAiR3JvdXAgMyIpLCAKICAgICBjb2wgPSBjKCJkYXJrcmVkIiwgInBpbmsiICwgImJsdWUiKSwKICAgICBwY2ggPSBjKDIwLDIwLDIwKSwgYnR5ID0gIm4iLCAgcHQuY2V4ID0gMS41LCBjZXggPSAwLjggLCAKICAgICB0ZXh0LmNvbCA9ICJibGFjayIsIGhvcml6ID0gRkFMU0UsIGluc2V0ID0gYygwLjQsIDAuMSkpCmBgYAoKCgpgYGB7cn0KIyBTdG9yZSBhbmFseXNpcyBkYXRhCmRmeCA8LSBkZlBQCmRmeCA8LSBjYmluZChwZXJzb25zLCBkZngpCm5hbWVzKGRmeCkgPC0gYygiU3ViamVjdCIsIG5hbWVzKGRmUFApKQp3cml0ZS5jc3YoZGZ4LCBvdXRwdXRGaWxlLCByb3cubmFtZXMgPSBGKQpgYGAKCiMjIExpbmVhciBNb2RlbApgYGB7cn0Kc2FtcGxlZERhdGEgPC0gZ2V0U2FtcGxlU2VnbWVudGVkRGF0YShOQSwgYWxsX0RyaXZlMSwgd2luZG93PVdJTkRPV19USU1FKQpsaW5lYXJNb2RlbE9ubGluZSA8LSBsbWVyKHBwTmV4dCB+IAogICAgICAgICAgICAgICgxIHwgU3ViamVjdCkKICAgICAgICAgICAgICArIFNwZWVkX3UKICAgICAgICAgICAgICArIFNwZWVkX3N0ZAogICAgICAgICAgICAgICsgQWNjX3UKICAgICAgICAgICAgICArIEFjY19zdGQKICAgICAgICAgICAgICArIEJyYWtlX3UKICAgICAgICAgICAgICArIEJyYWtlX3N0ZAogICAgICAgICAgICAgICsgU3RlZXJpbmdfdQogICAgICAgICAgICAgICsgU3RlZXJpbmdfc3RkLCAKICAgICAgICAgICAgZGF0YT1zYW1wbGVkRGF0YSwgUkVNTCA9IFQpCgojIGxtZXIocHBMb2dOb3JtYWxpemVkIH4gKDEgfCBTdWJqZWN0KSArIFNwZWVkX3UgKyBTcGVlZF9zdGQgKyBBY2NfdSArIEFjY19zdGQgKyBCcmFrZV91ICsgQnJha2Vfc3RkICsgU3RlZXJpbmdfdSArIFN0ZWVyaW5nX3N0ZCArIEhSICsgQlIsIGRhdGEgPSBwRGF0YSwgUkVNTCA9IFQpCgojIGFub3ZhKG1vZGVsKQpzdW1tYXJ5KGxpbmVhck1vZGVsT25saW5lKQpwbG90KGxpbmVhck1vZGVsT25saW5lKQpgYGAKCmBgYHtyfQpiZWhhdmlvcmFsQ29sdW1ucyA8LSBCRUhBVklPUkFMX0NPTFVNTlMKYmVoYXZpb3JhbE1hdHJpeCA8LSBtYXRyaXgobnJvdyA9IGxlbmd0aChwZXJzb25zKSwgbmNvbCA9IGxlbmd0aChiZWhhdmlvcmFsQ29sdW1ucykpCmBgYAoKCg==